package com.yuw.jdbc.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;

import com.yuw.utils.MyUtils;

public class DBProvider {

	/**
	 * 获取数据库连接对象
	 * 
	 * @return 数据库连接对象
	 */
	public Connection getConn() {
		// 返回类型
		Connection conn = null;
		try {
			// (1) 注册加载数据库驱动
			// 数据库驱动主类的包路径名，使用反射加载
			String strDirverName = "oracle.jdbc.OracleDriver";
			Class.forName(strDirverName);
			// (2) 获取数据库连接对象
			// 数据库连接各个属性
			// url连接串
			// 解析连接串：@前面固定写法；@后面是数据库服务器的ip地址或主机名；
			// 1521 数据库服务器监听的端口号；orcl：数据库名数据实例名
			String strUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
			// 用户名
			String strUserName = "hr";
			// 密码
			String strUserPsw = "hr";
			// 从驱动管理类中获取指定参数的数据库连接对象
			conn = DriverManager.getConnection(strUrl, strUserName, strUserPsw);
		} catch (Exception e) {
			// 数据库创建连接异常
			System.out.println("数据库创建连接异常:" + e.getMessage());
			e.printStackTrace();
		}
		// 返回值
		return conn;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @return 查询结果集ResultSet
	 */
	public ResultSet query(String strSql) {
		// 返回值类型
		ResultSet rs = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			rs = st.executeQuery(strSql);
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @return 查询结果集list
	 */
	public List<Map<String, Object>> queryList(String strSql) {
		// 返回值类型
		List<Map<String, Object>> lst = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			ResultSet rs = st.executeQuery(strSql);
			// 调用公用方法将，Resultset转换为list对象
			lst = MyUtils.convertResultSet2List(rs);
			// 关闭资源
			rs.close();
			conn.close();
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return lst;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param <T>
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @param clazz
	 *            实体类的Class对象
	 * @return 查询结果集list
	 */
	public <T> List<T> queryBeanList(String strSql, Class<T> clazz) {
		// 返回值类型
		List<T> lst = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			ResultSet rs = st.executeQuery(strSql);
			// 调用公用方法将，Resultset转换为list对象
			lst = MyUtils.convertResultSet2BeanList(rs, clazz);
			// 关闭资源
			rs.close();
			conn.close();
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return lst;
	}
}
